﻿package kit4j.common.command.executor;

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Queue;

import kit4j.common.command.Command;

/**
 * Command对象的执行者，以Command的添加先后顺序执行所有Command，每个Command只有在前一个Command 执行方法调用完以后才开始执行。
 * 该类型以一个Queue对象持有所有Command，以确保所有Command对象以其被添加的先后顺序被执行。
 * 
 * @author MiniKnife
 * 
 */
public class SequentialCommandExecutor implements CommandExecutor {

	/**
	 * Command对象集合。
	 */
	private Queue<Command> cmdList;

	/**
	 * 构造一个新的SequentialCommandExecutor对象。
	 */
	public SequentialCommandExecutor() {
		cmdList = new LinkedList<Command>();
	}

	/**
	 * 添加一个Command到等待执行队列的末尾。
	 */
	@Override
	public void addCommand(Command cmd) {
		cmdList.add(cmd);
	}

	/**
	 * 从Command队列中移除Command。
	 * 
	 * @param cmd
	 *            要移除的Command对象
	 */
	@Override
	public void removeCommand(Command cmd) {
		cmdList.remove(cmd);
	}

	/**
	 * 按队列顺序执行所有的Command。
	 */
	@Override
	public void execute() throws Exception {
		Iterator<Command> it = cmdList.iterator();

		while (it.hasNext()) {
			it.next().execute();
		}
	}

}
